//package com.demo.system.init.sentinel.rule.init;
//
//import com.alibaba.csp.sentinel.cluster.ClusterStateManager;
//import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientAssignConfig;
//import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientConfig;
//import com.alibaba.csp.sentinel.cluster.client.config.ClusterClientConfigManager;
//import com.alibaba.csp.sentinel.cluster.flow.rule.ClusterFlowRuleManager;
//import com.alibaba.csp.sentinel.cluster.flow.rule.ClusterParamFlowRuleManager;
//import com.alibaba.csp.sentinel.cluster.server.config.ClusterServerConfigManager;
//import com.alibaba.csp.sentinel.cluster.server.config.ServerTransportConfig;
//import com.alibaba.csp.sentinel.config.SentinelConfig;
//import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
//import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
//import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
//import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
//import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
//import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
//import com.alibaba.csp.sentinel.transport.config.TransportConfig;
//import com.alibaba.csp.sentinel.util.AppNameUtil;
//import com.alibaba.csp.sentinel.util.HostNameUtil;
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.TypeReference;
//import com.demo.system.init.sentinel.rule.constants.DemoConstants;
//import com.demo.system.init.sentinel.rule.entity.ClusterGroupEntity;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.PostConstruct;
//import java.util.List;
//import java.util.Objects;
//import java.util.Optional;
//
///**
// * 简单版本
// *
// * @author Eric Zhao
// */
//@Component
//public class DemoClusterInitFunc {
//    private static final String APP_NAME = AppNameUtil.getAppName();
//
//    private final String remoteAddress = "localhost";
//    private final String groupId = "SENTINEL_GROUP";
//
//    private final String flowDataId = APP_NAME + DemoConstants.FLOW_POSTFIX;
//    private final String paramDataId = APP_NAME + DemoConstants.PARAM_FLOW_POSTFIX;
//    private final String configDataId = APP_NAME + "-cluster-client-config";
//    private final String clusterMapDataId = APP_NAME + DemoConstants.CLUSTER_MAP_POSTFIX;
//
//    @PostConstruct
//    public void init() throws Exception {
//        initDynamicRuleProperty();
//        initClientConfigProperty();
//        initClientServerAssignProperty();
//        registerClusterRuleSupplier();
//        initServerTransportConfigProperty();
//        initStateProperty();
//    }
//
//    private void initDynamicRuleProperty() {
//        ReadableDataSource<String, List<FlowRule>> ruleSource = new NacosDataSource<>(remoteAddress, groupId,
//                flowDataId, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {
//        }));
//        FlowRuleManager.register2Property(ruleSource.getProperty());
//
//        ReadableDataSource<String, List<ParamFlowRule>> paramRuleSource = new NacosDataSource<>(remoteAddress, groupId,
//                paramDataId, source -> JSON.parseObject(source, new TypeReference<List<ParamFlowRule>>() {
//        }));
//        ParamFlowRuleManager.register2Property(paramRuleSource.getProperty());
//    }
//
//    private void initClientConfigProperty() {
//        ReadableDataSource<String, ClusterClientConfig> clientConfigDs = new NacosDataSource<>(remoteAddress, groupId,
//                configDataId, source -> JSON.parseObject(source, new TypeReference<ClusterClientConfig>() {
//        }));
//        ClusterClientConfigManager.registerClientConfigProperty(clientConfigDs.getProperty());
//    }
//
//    private void initServerTransportConfigProperty() {
//        ReadableDataSource<String, ServerTransportConfig> serverTransportDs = new NacosDataSource<>(remoteAddress, groupId,
//                clusterMapDataId, source -> {
//            List<ClusterGroupEntity> groupList = JSON.parseObject(source, new TypeReference<List<ClusterGroupEntity>>() {
//            });
//            return Optional.ofNullable(groupList)
//                    .flatMap(this::extractServerTransportConfig)
//                    .orElse(null);
//        });
//        ClusterServerConfigManager.registerServerTransportProperty(serverTransportDs.getProperty());
//    }
//
//    private void registerClusterRuleSupplier() {
//        ClusterFlowRuleManager.setPropertySupplier(namespace -> {
//            ReadableDataSource<String, List<FlowRule>> ds = new NacosDataSource<>(remoteAddress, groupId,
//                    namespace + DemoConstants.FLOW_POSTFIX, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {
//            }));
//            return ds.getProperty();
//        });
//        ClusterParamFlowRuleManager.setPropertySupplier(namespace -> {
//            ReadableDataSource<String, List<ParamFlowRule>> ds = new NacosDataSource<>(remoteAddress, groupId,
//                    namespace + DemoConstants.PARAM_FLOW_POSTFIX, source -> JSON.parseObject(source, new TypeReference<List<ParamFlowRule>>() {
//            }));
//            return ds.getProperty();
//        });
//    }
//
//    /**
//     * 数据格式：
//     * [{"clientSet":["112.12.88.66@8729","112.12.88.67@8727"],"ip":"112.12.88.68","machineId":"112.12.88.68@8728","port":11111}]
//     * machineId: <ip@commandPort>, commandPort for port exposed to Sentinel dashboard (transport module)
//     */
//    private void initClientServerAssignProperty() {
//        ReadableDataSource<String, ClusterClientAssignConfig> clientAssignDs = new NacosDataSource<>(remoteAddress, groupId,
//                clusterMapDataId, source -> {
//            List<ClusterGroupEntity> groupList = JSON.parseObject(source, new TypeReference<List<ClusterGroupEntity>>() {
//            });
//            return Optional.ofNullable(groupList)
//                    .flatMap(this::extractClientAssignment)
//                    .orElse(null);
//        });
//        ClusterClientConfigManager.registerServerAssignProperty(clientAssignDs.getProperty());
//    }
//
//    /**
//     * 数据格式：
//     * [{"clientSet":["112.12.88.66@8729","112.12.88.67@8727"],"ip":"112.12.88.68","machineId":"112.12.88.68@8728","port":11111}]
//     * machineId: <ip@commandPort>, commandPort for port exposed to Sentinel dashboard (transport module)
//     */
//    private void initStateProperty() {
//        ReadableDataSource<String, Integer> clusterModeDs = new NacosDataSource<>(remoteAddress, groupId,
//                clusterMapDataId, source -> {
//            List<ClusterGroupEntity> groupList = JSON.parseObject(source, new TypeReference<List<ClusterGroupEntity>>() {
//            });
//            return Optional.ofNullable(groupList)
//                    .map(this::extractMode)
//                    .orElse(ClusterStateManager.CLUSTER_NOT_STARTED);
//        });
//        ClusterStateManager.registerProperty(clusterModeDs.getProperty());
//    }
//
//    private int extractMode(List<ClusterGroupEntity> groupList) {
//        if (groupList.stream().anyMatch(this::machineEqual)) {
//            return ClusterStateManager.CLUSTER_SERVER;
//        }
//        boolean canBeClient = groupList.stream()
//                .flatMap(e -> e.getClientSet().stream())
//                .filter(Objects::nonNull)
//                .anyMatch(e -> e.equals(getCurrentMachineId()));
//        return canBeClient ? ClusterStateManager.CLUSTER_CLIENT : ClusterStateManager.CLUSTER_NOT_STARTED;
//    }
//
//    private Optional<ServerTransportConfig> extractServerTransportConfig(List<ClusterGroupEntity> groupList) {
//        return groupList.stream()
//                .filter(this::machineEqual)
//                .findAny()
//                .map(e -> new ServerTransportConfig().setPort(e.getPort()).setIdleSeconds(600));
//    }
//
//    private Optional<ClusterClientAssignConfig> extractClientAssignment(List<ClusterGroupEntity> groupList) {
//        if (groupList.stream().anyMatch(this::machineEqual)) {
//            return Optional.empty();
//        }
//        for (ClusterGroupEntity group : groupList) {
//            if (group.getClientSet().contains(getCurrentMachineId())) {
//                String ip = group.getIp();
//                Integer port = group.getPort();
//                return Optional.of(new ClusterClientAssignConfig(ip, port));
//            }
//        }
//        return Optional.empty();
//    }
//
//    private boolean machineEqual(/*@Valid*/ ClusterGroupEntity group) {
//        return getCurrentMachineId().equals(group.getMachineId());
//    }
//
//    private String getCurrentMachineId() {
//        // 此处心跳接口获取逻辑更改
//        String heartBeatPort = TransportConfig.getRuntimePort() > 0 ? String.valueOf(TransportConfig.getRuntimePort()) : SentinelConfig.getConfig("csp.sentinel.api.port");
//        return HostNameUtil.getIp() + SEPARATOR + heartBeatPort;
//    }//
//    private static final String SEPARATOR = "@";
//}